home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
ada
/
gwuada_5.zip
/
adaed
/
nyudemos
/
new_maze.ada
< prev
next >
Wrap
Text File
|
1992-09-01
|
3KB
|
93 lines
----------------------------------------------------------------------
--
-- New_maze : create a new maze
--
-- written by
--
-- Edmond Schonberg
--
-- Ada Project
-- Courant Institute
-- New York University
-- 251 Mercer Street
-- New York, New York 10012
--
-----------------------------------------------------------------------
with random_numbers; use random_numbers;
with system;
separate(maze)
procedure new_maze(start, goal: position; num_lines: integer) is
-- create a new maze with a given number of paths, including two long ones
-- that lead to source and destination.
pos: position;
d: direction ;
l: integer ;
task type liner is
-- one is created for each path.
entry draw(pos: position; dir: direction; len: integer);
end liner;
type new_liner is access liner ;
next_line: new_liner ;
function max_len(p: position; d: direction) return integer is
-- establish distance from any point to boundary,
-- along a given direction.
begin
case d is
when up => return p.row ;
when right => return (80 - p.col) ;
when down => return (23 - p.row) ;
when left => return p.col ;
end case ;
end max_len;
task body liner is
p: position ;
d: direction ;
l: integer;
begin
accept draw(pos: position; dir:direction; len: integer) do
p := pos ;
d := dir ;
l := len ;
end draw ;
for i in 1..l loop
putc(' ', p.row, p.col) ;
dist(p.row, p.col) := max_dist ;
p := next_pos(p, d) ;
end loop ;
end liner ;
begin
clear ;
case SYSTEM.SYSTEM_NAME is
when SYSTEM.PC_DOS =>
fill_screen(ASCII.SI);
when others =>
fill_screen('#');
end case;
pos := start ; -- first path starts at source.
d := up; -- which is always on bottom row.
l := 20 ;
for i in 1..num_lines loop
-- create the right number of tasks, and start each at a random posi-
-- tion, going in a random direction towards the boundary.
next_line := new liner ;
next_line.draw(pos, d, l) ;
pos := (2*(1 + random_int(11)), 2*(1 + random_int(38))) ;
d := direction'val(random_int(40) mod 4) ;
l := max_len(pos, d) ;
l := l/2 + random_int(l/4) ;
end loop ;
-- One more for path leading to destination. (always on top row).
next_line := new liner ;
next_line.draw(goal, down, 22) ;
exception
when storage_error | program_error =>
puts("unable to create new tasks. Try simpler maze.", 23,1);
end new_maze ;